package org.dromara.netbar.service;

import org.dromara.common.core.domain.R;
import org.dromara.netbar.domain.bo.NetbarMemberLoginBo;
import org.dromara.netbar.domain.vo.NetbarCouponMemberVo;
import org.dromara.netbar.domain.vo.NetbarMemberBalanceVo;
import org.dromara.netbar.domain.vo.NetbarMemberVo;
import org.dromara.netbar.domain.bo.NetbarMemberBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.netbar.mapper.NetbarMemberMapper;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 会员信息管理Service接口
 *
 * @author Lion Li
 * @date 2025-06-29
 */
public interface INetbarMemberService {

    /**
     * 查询会员信息管理
     *
     * @param memberId 主键
     * @return 会员信息管理
     */
    NetbarMemberVo queryById(Long memberId);

    /**
     * 分页查询会员信息管理列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 会员信息管理分页列表
     */
    TableDataInfo<NetbarMemberVo> queryPageList(NetbarMemberBo bo, PageQuery pageQuery);

    TableDataInfo<NetbarMemberVo> queryOnlinePageList(NetbarMemberBo bo, PageQuery pageQuery);

    /**
     * 查询符合条件的会员信息管理列表
     *
     * @param bo 查询条件
     * @return 会员信息管理列表
     */
    List<NetbarMemberVo> queryList(NetbarMemberBo bo);

    /**
     * 新增会员信息管理
     *
     * @param bo 会员信息管理
     * @return 是否新增成功
     */
    Boolean insertByBo(NetbarMemberBo bo);

    /**
     * 修改会员信息管理
     *
     * @param bo 会员信息管理
     * @return 是否修改成功
     */
    Boolean updateByBo(NetbarMemberBo bo);

    /**
     * 校验并批量删除会员信息管理信息
     *
     * @param ids     待删除的主键集合
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 根据租户Id和 账号查询会员信息
     */
    NetbarMemberVo getMember(String tenantId, String account);

    /**
     * 修改状态
     */
    Boolean changeStatus(NetbarMemberBo bo);


    /**
     * 下机
     */
    Boolean offline(NetbarMemberBo bo);

    void asyncCleanRedisData(NetbarMemberVo memberVo, Long memberId, Long clientId);

    NetbarMemberVo deductBalance(Long memberId, long consumedAmount);

    /**
     * 处理余额不足的会员（下机流程）
     * 这是一个独立的事务方法，保证数据库扣费和Redis清理的原子性
     */
    void handleOffline(String tenantId, Long memberId, Long clientId, long consumedAmount);

    R<?> checkOnlineMembers(NetbarMemberBo bo);

    void addMemberAwardBalance(Long memberId, Long couponAmount);

    void addBalance(Long memberId, Long couponAmount, Long balanceType);
    // 减会员余额
    void subtractBalance(Long memberId, Long couponAmount, Long balanceType);


    Map<Long, Integer> countMapByMemberLevelIds(Long[] levelIds);

    NetbarMemberBalanceVo getMemberBalance(Long memberId);

    NetbarMemberMapper netbarMemberMapper();

    void levelUpgrade(Long memberId, Long memberLevelId);

    void updateMemberPassword(Long memberId, String newPassword);

    String getMemberLevelName(Long memberId);
}
